}
}
-static void
-gdk_drag_update (GdkDrag *drag,
- double x_root,
- double y_root,
- GdkModifierType mods,
- guint32 evtime)
-{
- GdkMacosDrag *self = (GdkMacosDrag *)drag;
- GdkDragAction suggested_action;
- GdkDragAction possible_actions;
-
- g_assert (GDK_IS_MACOS_DRAG (self));
-
- self->last_x = x_root;
- self->last_y = y_root;
-
- gdk_drag_get_current_actions (mods,
- GDK_BUTTON_PRIMARY,
- gdk_drag_get_actions (drag),
- &suggested_action,
- &possible_actions);
-
- if (GDK_IS_MACOS_SURFACE (self->drag_surface))
- _gdk_macos_surface_move (GDK_MACOS_SURFACE (self->drag_surface),
- x_root - self->hot_x,
- y_root - self->hot_y);
-
- if (!self->did_update)
- {
- self->start_x = self->last_x;
- self->start_y = self->last_y;
- self->did_update = TRUE;
- }
-
- gdk_drag_set_actions (drag, possible_actions);
-}
-
-static gboolean
-gdk_dnd_handle_motion_event (GdkDrag *drag,
- GdkEvent *event)
-{
- double x, y;
- int x_root, y_root;
-
- g_assert (GDK_IS_MACOS_DRAG (drag));
- g_assert (event != NULL);
-
- /* Ignore motion while doing zoomback */
- if (GDK_MACOS_DRAG (drag)->cancelled)
- return FALSE;
-
- gdk_event_get_position (event, &x, &y);
- x_root = event->surface->x + x;
- y_root = event->surface->y + y;
- gdk_drag_update (drag, x_root, y_root,
- gdk_event_get_modifier_state (event),
- gdk_event_get_time (event));
-
- return TRUE;
-}
-
-static gboolean
-gdk_dnd_handle_grab_broken_event (GdkDrag *drag,
- GdkEvent *event)
-{
- GdkMacosDrag *self = GDK_MACOS_DRAG (drag);
- gboolean is_implicit = gdk_grab_broken_event_get_implicit (event);
- GdkSurface *grab_surface = gdk_grab_broken_event_get_grab_surface (event);
-
- /* Don't cancel if we break the implicit grab from the initial button_press. */
- if (is_implicit || grab_surface == (GdkSurface *)self->drag_surface)
- return FALSE;
-
- if (gdk_event_get_device (event) != gdk_drag_get_device (drag))
- return FALSE;
-
- gdk_drag_cancel (drag, GDK_DRAG_CANCEL_ERROR);
-
- return TRUE;
-}
-
-static gboolean
-gdk_dnd_handle_button_event (GdkDrag *drag,
- GdkEvent *event)
-{
- GdkMacosDrag *self = GDK_MACOS_DRAG (drag);
-
- g_assert (GDK_IS_MACOS_DRAG (self));
- g_assert (event != NULL);
-
-#if 0
- /* FIXME: Check the button matches */
- if (event->button != self->button)
- return FALSE;
-#endif
-
- if (gdk_drag_get_selected_action (drag) != 0)
- g_signal_emit_by_name (drag, "drop-performed");
- else
- gdk_drag_cancel (drag, GDK_DRAG_CANCEL_NO_TARGET);
-
- return TRUE;
-}
-
-static gboolean
-gdk_dnd_handle_key_event (GdkDrag *drag,
- GdkEvent *event)
-{
- GdkMacosDrag *self = GDK_MACOS_DRAG (drag);
- GdkModifierType state;
- GdkDevice *pointer;
- GdkSeat *seat;
- int dx, dy;
-
- dx = dy = 0;
- state = gdk_event_get_modifier_state (event);
- seat = gdk_event_get_seat (event);
- pointer = gdk_seat_get_pointer (seat);
-
- if (event->event_type == GDK_KEY_PRESS)
- {
- guint keyval = gdk_key_event_get_keyval (event);
-
- switch (keyval)
- {
- case GDK_KEY_Escape:
- gdk_drag_cancel (drag, GDK_DRAG_CANCEL_USER_CANCELLED);
- return TRUE;
-
- case GDK_KEY_space:
- case GDK_KEY_Return:
- case GDK_KEY_ISO_Enter:
- case GDK_KEY_KP_Enter:
- case GDK_KEY_KP_Space:
- if (gdk_drag_get_selected_action (drag) != 0)
- g_signal_emit_by_name (drag, "drop-performed");
- else
- gdk_drag_cancel (drag, GDK_DRAG_CANCEL_NO_TARGET);
-
- return TRUE;
-
- case GDK_KEY_Up:
- case GDK_KEY_KP_Up:
- dy = (state & GDK_ALT_MASK) ? -BIG_STEP : -SMALL_STEP;
- break;
-
- case GDK_KEY_Down:
- case GDK_KEY_KP_Down:
- dy = (state & GDK_ALT_MASK) ? BIG_STEP : SMALL_STEP;
- break;
-
- case GDK_KEY_Left:
- case GDK_KEY_KP_Left:
- dx = (state & GDK_ALT_MASK) ? -BIG_STEP : -SMALL_STEP;
- break;
-
- case GDK_KEY_Right:
- case GDK_KEY_KP_Right:
- dx = (state & GDK_ALT_MASK) ? BIG_STEP : SMALL_STEP;
- break;
-
- default:
- break;
- }
- }
-
- /* The state is not yet updated in the event, so we need
- * to query it here. We could use XGetModifierMapping, but
- * that would be overkill.
- */
- gdk_macos_device_query_state (pointer, NULL, NULL, NULL, NULL, &state);
-
- if (dx != 0 || dy != 0)
- {
- GdkDisplay *display = gdk_event_get_display ((GdkEvent *)event);
-
- self->last_x += dx;
- self->last_y += dy;
-
- _gdk_macos_display_warp_pointer (GDK_MACOS_DISPLAY (display),
- self->last_x,
- self->last_y);
- }
-
- gdk_drag_update (drag,
- self->last_x, self->last_y,
- state,
- gdk_event_get_time (event));
-
- return TRUE;
-}
-
-static gboolean
-gdk_macos_drag_handle_event (GdkDrag *drag,
- GdkEvent *event)
-{
- g_assert (GDK_IS_MACOS_DRAG (drag));
- g_assert (event != NULL);
-
- switch ((guint) event->event_type)
- {
- case GDK_MOTION_NOTIFY:
- return gdk_dnd_handle_motion_event (drag, event);
-
- case GDK_BUTTON_RELEASE:
- return gdk_dnd_handle_button_event (drag, event);
-
- case GDK_KEY_PRESS:
- case GDK_KEY_RELEASE:
- return gdk_dnd_handle_key_event (drag, event);
-
- case GDK_GRAB_BROKEN:
- return gdk_dnd_handle_grab_broken_event (drag, event);
-
- default:
- return FALSE;
- }
-}
-
static void
gdk_macos_drag_finalize (GObject *object)
{
drag_class->set_cursor = gdk_macos_drag_set_cursor;
drag_class->cancel = gdk_macos_drag_cancel;
drag_class->drop_performed = gdk_macos_drag_drop_performed;
- drag_class->handle_event = gdk_macos_drag_handle_event;
properties [PROP_DRAG_SURFACE] =
g_param_spec_object ("drag-surface", NULL, NULL,